Пока что не стоит. Значимых предпосылок к тому что все игроки переберутся на официальные сервера пока нет.
Однако учитывать возможности и ограничения новых патчей стоит. Мы придерживаемся такого направления пока, сейчас разрабатываем под 26а.
Ну, всё))) Бутылка прошла мимо тебя))) Решение пришло само собой - скачал тестовый американский варик и там п оумолчанию выставил оразрешение 1280х960, плюс там было окошко с возможностью растянуть экран по контуру. При проверке разрешения экрана выяснилось, что русский варик соответствует тому разрешению которое выставляет видюха. Тупо поменял разрешение рабочего стола на 1280х960 и всё пошло (в настройках варика автоматом стало такое же).
Событие - герой входит в нужную область
Действие - Kill такой-то unit
Если нужно не какого-то конкретного, то определение позиции героя, выделять в группу нужных юнитов на нужном расстоянии и выбирать случайного из них и kill его. В идеале безутечно с обнулением переменных.
В чём проблемы?
Я знаю только один способ избавления от утечек - писать код без них.Тебе нужен кто-то знающий игровые скрипты или злосчастный Jass. Иначе уровень неопределённости вопроса не позволит подсказать что-то дельное.
bOrissko, зоны достаточно крупные, идут в центр области
Просто сделал такую же систему и некоторые тупили и стояли на месте, но стоило сделать точку приказа, чуть дальше от границы области (по которой идет проверка, зашли или нет) и поменять с рандомной точки до центра и они перестали останавливаться.
Дик, переменную можно скормить этому триггеру через JASS или Lua, но событие запишется на основании значения переменной на момент добавления события - можно сколько угодно менять переменную после этого, но триггер будет работать только на того юнита который был записан в переменную на момент когда добавлялось событие. Возможно действие "добавить событие к триггеру" в ГУИ тоже так умеет.
Если абуза боишься, можно просто поставить, что пассивка не действует чаще, например, раза в 0.5 секунды (таймером вешаешь на юнита "что-то" - абилу-маркер, хэш-значение и т. д., после окончания таймера убираешь, а в условиях - если у юнита это "что-то" есть, то пассивка не канает)
Filius Dei, так что-то не так делаешь. Функцию нельзя внутри функции копировать, функцию закинь повыше.
знаешь такую находил много раз. атака сзади атака в спину и др. ищи на форуме "заклинание на заказ", там в первых наработках есть похожее. Углы сложно подсчитать?
подробности
Я тебе скинул пример, на событие юнит атакован. Но ты должен знать что "юнит атакован" - событие, при котором юнит начинает замахиваться, а потом пускает снаряды (у милишников без этого), и потом происходит урон. Надо делать систему урона от события "юнит получает урон". Так как при событии "юнит атакован" можно промахнуться.
Когда при событии "получает урон" наносишь дополнительный триггерный урон, смотри, чтобы зацикливания не было.
на экран выводят отладочные сообщение. Когда триггер срабатывает, ты об этом не знаешь. Ты не видишь этого, тк все действия внутри игры. А сработал ли триггер, мб вообще не работает (пример забыл включить триггер)? Поэтому выводят на экран. Или другая ситуация: почему то условие не работает, проверяем прокатило ли условие: тоже самое в блоке условия вставляют действие вывода сообщения игроку.
if b then //если условие b прокатило
выводим сообщение "прокатило условие b"
else //иначе
выводим сообщение "условие b не прокатило" //будем знать что триггер хоть работает
endif
будем знать что условия прокатывает или нет. Мб у вас условие багованное, один раз на jass такое написал, обрывалось или не работало. Сообщение никакого не выводило.
Или допустим нужно знать какие числа или строки у вас, как считает, считает ли вообще? тоже выводишь на экран результат строки или число
где его взять
в триггере в действии в разделе "игра" можно сообщение выводить
так можешь еще проверять переменные вариковские. например, если не знаешь что за переменная. скажем какой юнит хранится под этой переменной как trigger unit. выводи имя юнита на экран, выведут название типа например "пехотинец", который вызвал каст (будешь знать что вызвал футман а не бугай. И значит trigger unit - кастер итд). про потоки это мой анализ, но как бы локалки делай как в статье про локи, это с опытом придет
Дальше пришла в голову другая идея. Думаю, можно сделать с помощью ремонта зданий Альянса: на месте смерти героя создаётся здание с моделью креста со здоровьем 1/100 ед., а союзные герои ремонтируя крест будут повышать её здоровье, получается некая иллюзия прогресс бара. И если спрятать способность ремонта с помощью функции HideAbilityButton( ) из мемхака, то будет ли она срабатывать при нажатии на ПКМ? Также, как отловить момент полного ремонта здания? С помощью таймера проверять процент здоровья каждые доли секунды?
раскрыть
scope HeroRevive initializer Initialization
struct herorevive
private unit dyingUnit
private unit reincarnate
private real life
private thistype prev
private thistype next
public static constant trigger trig = CreateTrigger( )
public static constant timer period = CreateTimer( )
private static method iterate takes nothing returns nothing
local thistype this = thistype( 0 ).next
loop
exitwhen ( this == 0 )
if ( GetWidgetLife( this.reincarnate ) > this.life ) then
set this.life = GetWidgetLife( this.reincarnate )
elseif ( GetWidgetLife( this.reincarnate ) >= GetUnitState( this.reincarnate, UNIT_STATE_MAX_LIFE ) ) then
call ReviveHero( this.dyingUnit, GetUnitX( this.dyingUnit ), GetUnitY( this.dyingUnit ), true )
call RemoveUnit( this.reincarnate )
set this.reincarnate = null
set this.life = 0.0
set this.prev.next = this.next
set this.next.prev = this.prev
if ( thistype( 0 ).next == 0 ) then
call PauseTimer( thistype.period )
endif
call thistype.deallocate( this )
elseif ( GetWidgetLife( this.reincarnate ) <= this.life ) then
set this.life = 1.0
call SetWidgetLife( this.reincarnate, this.life )
endif
set this = this.next
endloop
endmethod
public static method actions takes nothing returns nothing
local thistype this = thistype.allocate( )
set this.next = 0
set this.prev = thistype( 0 ).prev
set this.next.prev = this
set this.prev.next = this
set this.dyingUnit = GetDyingUnit( )
set this.reincarnate = CreateUnit( GetOwningPlayer( this.dyingUnit ), 'h003', GetUnitX( this.dyingUnit ), GetUnitY( this.dyingUnit ), 0.0 )
set this.life = 1.0
call SetUnitPathing( this.reincarnate, false )
call SetWidgetLife( this.reincarnate, this.life )
if ( this.prev == 0 ) then
call TimerStart( thistype.period, 0.10, true, function thistype.iterate )
endif
endmethod
public static constant method conditions takes nothing returns boolean
return IsUnitType( GetDyingUnit( ), UNIT_TYPE_HERO )
endmethod
endstruct
public function Initialization takes nothing returns nothing
call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 1 ), EVENT_PLAYER_UNIT_DEATH, null )
call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 2 ), EVENT_PLAYER_UNIT_DEATH, null )
call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 3 ), EVENT_PLAYER_UNIT_DEATH, null )
call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 4 ), EVENT_PLAYER_UNIT_DEATH, null )
call TriggerAddCondition( herorevive.trig, Condition( function herorevive.conditions ) )
call TriggerAddAction( herorevive.trig, function herorevive.actions )
endfunction
endscope
Вот только если спрятать кнопку через HideAbilityButton( ), то способность ремонта зданий исчезает и не работает через ПКМ.
Да у тебя куча дыр, во-первых ты не запустил триггер 115 области lumber direction, и оно соответственно не реагирует на событие. Во-вторых перепроверь gold проверку условия на да или нет в той карте которую ты отправил стоит нет
А золото не движется потому что ты ожидание 0,5 сек поставил а область в милисекунде от изначальной то есть триггер не успевает запуститься
невозможно.
Только если обрабатывать всю информацию вручную.
Кинули лечилку - прибавить 40, повешали регенерацию хуска - проверить уровень способности, добавить. Постоянно проверять на ауры регена, полученные баффы и их уровень.
Аура смерти действует не в процентах, а в фиксированных числах. А нужно в процентах.
Аура Смерти (Unholy Aura) ['AUau'] - даёт бонус к регенерации здоровья (чистым значением) и бонус к скорость передвижения юнита (в процентах).
Регенерация здоровья никак не зависит от того, какая и сколько регенерации у юнита. Она просто даёт +N (или минус, если трицательное) к его ежесекундному показателю. Это значение не усиливается и не ослабляется чем-либо (лишь складывается). При этом там есть параметр Процент повышения (Uau3), который превращает указанное число в множитель на текущее в данный момент максимальное здоровье юнита (у героев макс.ХП изменяется с течением игры, это имеется ввиду).
Зачем делать сон аурами, которые не складываются, дак еще и их бафф не удаляется и юниты могут регенится по 2-4 сек свыше того момента как исчезла аура.
Создаем триггер с переодическим событием, скажем 0.25 сек или 0.5, и группу, в которой всем юнитам восстанавливаем % хп исходя из уровня баффа сна, если у юнита нет баффа сна, удаляем его из группы, и еще 1 триггер который срабатывает на каст сна, и заносит спящего в группу регенерации. Легко, просто, полностью кастомный реген который ни с чем не багует.
проведя еще пару часов за тестами, в голову пришла мысль о фаталках из-за большого числа юнитов на мелководье
остановился на том, что ошибка вылетела из-за случайных точек спауна по квадрату на мелко-глубкоководной местности. сделал спаун в отдельных мини областях - ошибка исчезла
Карты - C:\Users\%username%\Documents\Warcraft III\Maps
Кампании - C:\Users\%username%\Documents\Warcraft III\Campaigns Папку для кампаний возможно потребуется создать самому.
BartSi, очень странно.
Нашёл проблему. В редакторе ландшафта нужно выбрать Camera Palette (там где юниты, декорации и прочее) выбрать первую строчку (камера без имени) и удалить. Тогда проблема решится. Сбросил триггеры и удалил камеру.
Ошибка из-за того, что у камеры почему-то пустое имя. Из-за этого её переменная оканчивается на _, что нельзя в JASS.
Эта проблема вызывается физическими повреждениями железа, как я нагуглил
Детали так сходу не скажу, но SFile.cpp - кусок storm.dll, вроде как обработчик строк
Но там тоже проблема с отображением типа атаки на герое.
Не понимаю, чем для данной задачи не устраивает Перевоплощение в такого же юнита с другой атакой.
По идее может помочь мемхак, но он только для версии игры 1.26а.
Было создано 22 366 679 экземпляров класса CUnitListNode, которые заняли 255.9 МБ памяти.
При очередной попытке выделения, игра упала.
Виной всему утечки памяти: за 21 минуту набралось 80 тысяч групп и 20 тысяч точек.
Также, из-за выполнения большого количества кода, сильно лагает.
На стадии выбора героя (первые две минуты), выполняется 550 000 операций в секунду, а далее — 1 200 000.
Для сравнения: лимит потока — 300 000 операций.
Хорошо, что ты приложил карту, так как в логе маловато информации.
Кривоватая подгрузка, удалять не обязательно. Лучше юзать preload без этаких костылей, темболее в JASS есть механизмы автоматического создания pld скриптов.
В общем во время сохранения файла я попробую продублирую весь код, во время загрузки файла я сначало выполню файл в котором чисто Preload("Код") чтобы его занести на компьютер клиента, а только потом начну выполнять Preload("\")\n <Код>\n//"). Надеюсь сработает. А про то что никто в этом не видит смысла, так часто говорят.
Получилось так что я допустил туже ошибку...
Может есть какая-нибудь нативка/функция которая будет синхронизировать информацию? Если нет, то скорее всего я зря пытаюсь.
Есть какая-нибудь статья про TriggerSyncReady и Start? xgm.guru/p/wc3/159609, тут обсуждается похожая ситуация.
В общем дождался друга чтоб протестить TriggerSyncStart и Ready, в итоге я поставил их перед функцией Preloader(сначало Start потом Ready) и всё десинк пропал.
Filius Dei, создаешь способность, которой ты будешь ставить метки. Даешь ей бафф без каких-либо эффектов.
Потом при касте своей способности которая меняет владельца просто проверяешь у цели наличие твоего баффа.
Death-time это время разложения и анимы смерти, после его истечения юнита уже нету на карте, но труп может быть и хендл пока висит.
Все неразлагающиеся (вспомни летунов) умирают сразу не оставляя трупов и удаляются после death time.
Так же суммоны, всякие варды. Можно добавить баф призыва волков, тогда юниты удалятся сразу после смерти.
Вот, правильно импортировал. Сама модель крайне странная, потому что War 3 ME не хочет ее открывать (увидел, что собой представляет только в War 3 Viewer'e).
Опытным путем, спустя второй день нервов, нашел выход. Я снова импортировал текст в карту, и она перестала крашиться. Почему отсутствие текста влияло на неё, не знаю.
Extremator, уже предлагали darkowlom, всеравно нужна бд на все возможные эффекты
короче все возможные ответы даны
тему закрываю
если кто то придумает чтото новое пишите автору в пм
Идеальный вариант чтобы игрок сам мог решать, нужно ли ему это. Сделай, если будет смотреться неплохо. И каким то образом запилить возможность выключения этой фичи.
да я решыл проблему я просто перегрузил комп
Я понел в чом проблема я поставил в vjass 2 галки нижние включил из надо отключать и тогды проблем не будет
Я бы предложил для начала попробовать себя в программировании, прежде чем использовать Jass. А так можно использовать GUI и переводить на Jass. На форуме даже была статья по оптимизации при переводе GUI –> Jass (да и просто оптимизации Jass и углубление в скриптование Warcraft 3). Лично мне это быстро помогло перейти на Jass за несколько дней.
Возможно, главным вопросом будет по типу: "А вы вообще понимаете, что вы делаете на том же GUI?"
Вариант по индексу не хотелось бы, ввиду использования для разных моделей.
Придётся. Walk не играется триггерно при нормальных условиях.
Впрочем можно заставить проигрывать walk поставив юниту скорость движения 0 в редакторе объектов.
События:
Юнит Умирает Условия:
(Diying unit) равно Герой
Owner of (Diying unit) не равно Нейтрально-враждебный Действия:
Wait 10 секунд
Воскресить (Diying unit)
В этом триггере (Diying unit) не будет меняться с каждой новой смертью, она как локалка.
Не плодите триггеров, все нужные действия можно и в цикле сделать.
У вас переменная T отвечает за состояние героя, зачем проверять жив юнит или нет?
T<0 Жив
T==0 Нужно воскресить прям сейчас
T>0 Ждёт воскрешения Cardinal:
смотри в кампании Рексара, в разделе триггеры, как там сделано.
По-моему ничего сложного нет:
ловим , что герой около камня. Попробуй расположить около камней ректы, и с помощью события ловить их. Конечно можно еще ловить таймером, проверяя каждую сек дистанцию между камнями и героем, или событием радиуса между ними. При заходе в эту область проигрываем анимацию свечения одного камня (узнай в модельке что за анимация), и выключаем свечение другого камня. Запоминаем для этого героя место спавна. Не знаю, если мульти делать, можно ли через getlocalplayer анимацию задавать. Если можно, то модель камня проще переделать, там разные цвета
При смерти героя таймером ждем, и спавним у этого места, проигрывая анимацию воскрешения у камня.
» WarCraft 3 / Патч 1.29
» WarCraft 3 / юнит вошёл в область
» WarCraft 3 / BlzUnitHideAbility
» WarCraft 3 / Как сделать атаку у героя/юнита 0 - 0?
» WarCraft 3 / Не могу разобраться
» WarCraft 3 / Как отловить смерть героев с крестом воскрешения?
» WarCraft 3 / Помогите разобраться в триггерах карты
» WarCraft 3 / Реген
» WarCraft 3 / Фатальная ошибка, связанная с картой
» WarCraft 3 / Не видит карту
» WarCraft 3 / Не вылезает
» WarCraft 3 / Космодесантник
» WarCraft 3 / Как добавить курьера в карту.
» WarCraft 3 / Preload
» WarCraft 3 / Получить кликнувшего игрока
» WarCraft 3 / Получить кликнувшего игрока
» WarCraft 3 / Глючит карта
» WarCraft 3 / Расстояние до цели
» WarCraft 3 / Урон по линии
» WarCraft 3 / Что делать?
» WarCraft 3 / Звук
» WarCraft 3 / Поднятие юнита в воздух.
» WarCraft 3 / Воскрешение
» WarCraft 3 / Reforged на LUA
» WarCraft 3 / Требование расы